#include<iostream>
#include"ringque.hpp"
#include<vector>
#include<unistd.h>

using namespace RingQueue;
std::vector<pthread_t>threads;

// struct Help
// {
//     Help(ringQueue<int>que,std::string name)
//         :_que(que)
//         ,_name(name)
//     {}
//     ringQueue<int>&_que;
//     std::string _name;
// };

void* producterTask(void*argc)
{
    ringQueue<int>&que=*(ringQueue<int>*)argc;
    std::cout<<"生产者开始工作"<<std::endl;
    //生产者往队列中放入数据
    int cnt=0;
    while(true)
    {
        que.pushData(cnt);
        std::cout<<"producter put "<<cnt++<<std::endl;
    }

    // Help&h=*(Help*)argc;
    // //生产者往队列中放入数据
    // int cnt=0;
    // while(true)
    // {
    //     h._que.pushData(cnt);
    //     std::cout<<h._name<<" put "<<cnt<<std::endl;
    // }
    return nullptr;
}

void* consumerTask(void*argc)
{
    ringQueue<int>&que=*(ringQueue<int>*)argc;
    //消费者从队列中拿出数据
    sleep(3);
    while(true)
    {
        int data=0;
        que.getData(&data);
        std::cout<<"consumer get "<<data<<std::endl;
        sleep(1);
    }

    // Help&h=*(Help*)argc;
    // //消费者从队列中拿出数据
    // sleep(3);
    // while(true)
    // {
    //     int data=0;
    //     h._que.getData(&data);
    //     std::cout<<h._name<<"get "<<data<<std::endl;
    //     sleep(1);
    // }
    return nullptr;
}

void makeProducter(int n,ringQueue<int>&que)
{
    for(int i=0;i<n;i++)
    {
        pthread_t id=0;
        pthread_create(&id,nullptr,producterTask,&que);

        // std::string name("producter["+std::to_string(i)+"]");
        // Help*h=new Help(que,name);
        // pthread_create(&id,nullptr,producterTask,&h);

        threads.push_back(id);
    }
}

void makeConsumer(int n,ringQueue<int>&que)
{
    for(int i=0;i<n;i++)
    {
        pthread_t id=0;
        pthread_create(&id,nullptr,consumerTask,&que);

        // std::string name("consume["+std::to_string(i)+"]");
        // Help*h=new Help(que,name);
        // pthread_create(&id,nullptr,consumerTask,&h);

        threads.push_back(id);
    }
}

void waitAll()
{
    for(auto&thread:threads)
    {
        pthread_join(thread,nullptr);
    }
}

int main()
{
    ringQueue<int>que(5);
    makeConsumer(3,que);
    makeProducter(2,que);
    waitAll();
    return 0;
}